use std::collections::HashMap;

fn main() {
    // 元组: 不同类型的集合
    let tuple: (i32, f64, char) = (500, 6.4, 'A');
    println!("元组：{}, {}, {}", tuple.0, tuple.1, tuple.2);

    // 解构元组
    let (x, y, z) = tuple;
    println!("解构后的元组：{}, {}, {}", x, y, z);

    // 数组
    let arr: [i32; 5] = [1, 2, 3, 4, 5];
    println!("数组：{}, {}, {}, {}, {}", arr[0], arr[1], arr[2], arr[3], arr[4]);

    // 切片 下标1-3的元素
    let slice = &arr[1..4];
    println!("切片：{}, {}, {}", slice[0], slice[1], slice[2]);

    // 集合
    let mut card = vec!['A', '2', '3', '4'];
    card.push('5');  // 添加元素
    card.pop();      // 移除最后一个元素
    let mut latest = vec!['J', 'Q', 'K'];
    // 合并两个集合
    card.append(&mut latest);
    println!("合并集合：{:?}", card);

    // 获取集合第一个元素
    let result = match card.get(0) {
        Some(value) => value.to_string(),
        None => "空".to_string(),
    };
    println!("第一个卡牌：{}", result);

    // 字符串
    let a1 = String::from("Iceman");
    let a2 = String::from("Young");
    let content = a1 + "-" + &a2;
    println!("拼接字符串：{}", content);

    // Map
    let andy = String::from("安迪");
    let jack = String::from("杰克");
    let marry = String::from("玛丽");
    let mut scores = HashMap::<String, u32>::new();

    // 使用 clone() 克隆值来避免值被移动
    scores.insert(andy.clone(), 20);
    scores.insert(jack.clone(), 59);
    scores.insert(marry.clone(), 88);
    println!("杰克分数：{}", scores.get("杰克").unwrap());

    // 遍历Map
    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }

    // 如果没有杰克则设置杰克为88
    scores.entry(jack.clone()).or_insert(88);
    println!("杰克分数：{}", scores["杰克"]);

    // 使用 `get_mut` 修改值
    if let Some(x) = scores.get_mut(&marry) {
        *x = 99;  // 解引用，修改值
    }
    println!("玛丽分数：{}", scores["玛丽"]);
}
